<?php

class Solicitudes_Model_Solicitudes extends Model_Cna {
	
	private $solicitudesTable;
	
	public function __construct() {
		parent::__construct();
		$this->solicitudesTable = new Solicitudes_Model_DbTable_Solicitudes();
	}
	
	/**
	 * Devuelve un arreglo del listado de solicitudes por IES
	 * @param int $codinsitucion Código saces de la IES
	 * @return array
	 */
	public function getSolicitudes($tiposolicitud,$datos,$criterio="") {
		return $this->solicitudesTable->getSelectFetchAll($tiposolicitud,$datos,$criterio);
	}
	/**
	 * Almacena los datos de la solicitud en la base de datos
	 * @param array $datos Los datos de la solicitud
	 */
	public function guardarSolicitud(array $datos) {
		
		if(isset($datos["codsolicitud"]) && !empty($datos["codsolicitud"])) {
			$this->solicitudesTable->find($datos["codsolicitud"])->current()->setFromArray($datos)->save();
		} else {
		    unset($datos["codsolicitud"]);
			return $this->solicitudesTable->createRow($datos)->save();
		}
	}
	
	/**
	 * Carga los datos de una solicitud
	 * @param $codsolicitud Código de la solicitud
	 * @return Array con los datos de la solicitud
	 */
	public function cargarDatos($codsolicitud){
		return $this->solicitudesTable->find($codsolicitud)->current()->toArray();
	}

	/**
	 * Elimina una solicitud
	 * @param $codsolicitud Código de la solicitud
	 */
	public function eliminarSolicitud($codsolicitud){
	    $this->eliminarProcesosSolicitud($codsolicitud);
		return $this->solicitudesTable->find($codsolicitud)->current()->delete();
	}
	
	/**
	 * Almacena los datos de un archivo adjunto a una solicitud
	 * @param array $datos Los datos del registro
	 */
	public function guardarAdjuntoSolicitud($datos) {
	    if (!isset($datos["campo"])){
	        $datos["campo"] = "coddocumento";
	    }
	    
		$adjuntoTable = new Generales_Model_DbTable_Documentos();
	    $adjuntoTable->getAdapter()->beginTransaction();
		try {
			$key = $adjuntoTable->createRow($datos)->save();
			$SolicitudTable = new Solicitudes_Model_Solicitudes();
			$datos_rel[$datos["campo"]] = $key;
			$datos_rel["codsolicitud"]  = $datos["codsolicitud"];
			$SolicitudTable->guardarSolicitud($datos_rel);
			$adjuntoTable->getAdapter()->commit();
		} catch(Exception $e) {
			$adjuntoTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	/**
	 * Obtiene los datos del reporte :: Resumen página pricipal
	 * @param string $criterio  Criterio de búsqueda
	 * @param array $datos Datos para la búsqueda
	 */
	public function getProcesos($criterio,$datos){
	    $procesosTable = new Solicitudes_Model_DbTable_Procesos();
	    return $procesosTable->getProcesos($criterio,$datos);
	}
	
	/**
	 * Verfica la completitud de todos los procesos asociados a la solicitud
	 * @param intiger $codsolicitud  Código de la solicitud
	 * @return boolean  True o false
	 */
	public function verificarCompletitud($codsolicitud) {
	    $procesosTable = new Solicitudes_Model_DbTable_Procesos();
//	    $historicoProcesosTable = new Solicitudes_Model_DbTable_Historicoprocesos();
	    $detalleSolicitud = new Solicitudes_Model_DetalleSolicitud();
	    $ValoresDominios= new Generales_Model_ValoresDominios();
	    $codtabs = array();
		$estructuraInformacion = $ValoresDominios->cargarDatos("INFORMACION_PROGRAMAS");
		
		for ($index = 0; $index < count($estructuraInformacion); $index++) {
			if($estructuraInformacion[$index]["codpadre"]==null) {
			    $codtabs[] = $estructuraInformacion[$index]["codigo"];
			}
		}
	    
	    $procesos = $procesosTable->getProcesosSolicitud($codsolicitud);
	    $completo = true;
	    foreach ($procesos as $proc) {
	        $codestado = $detalleSolicitud->getEstadoProceso($proc["codproceso"]);
	        foreach ($codtabs as $codigo) {
	            
	        	$completo = $completo && $detalleSolicitud->isCompleto($proc["codproceso"], $codestado, $codigo);
	        }
	    }
	    return $completo;
	}
	
	/**
	 * Obtiene la solicitud de la información acutal de la información IES
	 * @param $codinstitucion Código institución
	 * @param $tiposolicitud Tipo solicitud (1: Acreditación pregrado, 2: Renovación pregrado, 3: Acreditació posgrados, 4:Renovación
	 * 										 5: Acreditación IES 6: Renovación IES)
	 * @param $actual Parámetro solo para la acreditación y renovación IES
	 */
	function getSolicitudIES($codinstitucion,$tiposolicitud,$actual="S") {
		return $this->solicitudesTable->getSolicitudIES($codinstitucion,$tiposolicitud,$actual="S");
	}
	
	/**
	 * Finaliza el proceso de condiciones iniciales
	 * @param Integer $codsolicitud Código de la salud
	 */
	function finalizarCondicionesIniciales($codsolicitud, $fecha="") {
	    $procesosTable = new Solicitudes_Model_DbTable_Procesos();
	    $historicoTable = new Solicitudes_Model_Historicoprocesos();
	    $procesos = $procesosTable->getCodprocesosSolicitud($codsolicitud);
	    $procesosTable->getAdapter()->beginTransaction();
		try {
		    foreach ($procesos as $proc) {
		        $historicoTable->guardarEstadoProceso($proc["codproceso"], Solicitudes_Model_Historicoprocesos::COMPLETITUD, $fecha);
		    }
			$procesosTable->getAdapter()->commit();
		} catch(Exception $e) {
			$procesosTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	
	/**
	 * Finaliza el informe de visita de consejeros
	 * @param Integer $codsolicitud Código de la salud
	 */
	function finalizarInformeConsejero($codsolicitud) {
	    $procesosTable = new Solicitudes_Model_DbTable_Procesos();
	    $historicoTable = new Solicitudes_Model_Historicoprocesos();
	    $procesos = $procesosTable->getCodprocesosSolicitud($codsolicitud);
	    $procesosTable->getAdapter()->beginTransaction();
		try {
		    foreach ($procesos as $proc) {
		        $historicoTable->guardarEstadoProceso($proc["codproceso"], Solicitudes_Model_Historicoprocesos::CON_INFORME_CONSEJERO);
		    }
			$procesosTable->getAdapter()->commit();
		} catch(Exception $e) {
			$procesosTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	
	/**
	 * Finaliza el proceso de condiciones iniciales
	 * @param Integer $codsolicitud Código de la solicitud
	 */
	function finalizarCompletitud($codsolicitud,$estado) {
	    $procesosTable = new Solicitudes_Model_DbTable_Procesos();
	    $historicoService = new Solicitudes_Model_Historicoprocesos();
	    $procesos = $procesosTable->getCodprocesosSolicitud($codsolicitud);
	    
	    //$procesosTable->getAdapter()->beginTransaction();
		try {
		    foreach ($procesos as $proc) {
		        if (in_array($estado, array(Solicitudes_Model_Historicoprocesos::CONDICIONES_INICIALES,Solicitudes_Model_Historicoprocesos::EN_AUTOEVALUACION))){
		        	if ($estado==Solicitudes_Model_Historicoprocesos::CONDICIONES_INICIALES){
		            	$historicoService->guardarEstadoProceso($proc["codproceso"],$estado,"","Cambio automático de estado seleccionado por el usuario","S");
		        	}else{
		        		
		        		Zend_Debug::dump($proc["codproceso"]);
		        		Zend_Debug::dump($estado);
		        		
                		$historicoService->guardarEstadoProceso($proc["codproceso"],$estado, "","Cambio automático de estado seleccionado por el usuario","","S");
		        	}
		        }else{
                    $historicoService->guardarEstadoProceso($proc["codproceso"],$estado);
		        }
		    }
			//$procesosTable->getAdapter()->commit();
		} catch(Exception $e) {
			//$procesosTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	
	/**
	 * Almacena los datos de un proceso
	 * @param array $datos Los datos del proceso
	 */
	public function guardarProceso(array $datos) {
		$procesosTable = new Solicitudes_Model_DbTable_Procesos();
		if(isset($datos["codproceso"]) && !empty($datos["codproceso"])) {
			$procesosTable->find($datos["codproceso"])->current()->setFromArray($datos)->save();
		} else {
		    unset($datos["codproceso"]);
			return $procesosTable->createRow($datos)->save();
		}
	}

	/**
	 * Eliminar procesos de una solicitud
	 * @param integer $codsolicitud código de la solitud
	 */
	public function eliminarProcesosSolicitud($codsolicitud) {
		$procesosTable = new Solicitudes_Model_DbTable_Procesos();
        $procesosTable->getProcesosSolicitud($codsolicitud);
	    $procesos = $procesosTable->getCodprocesosSolicitud($codsolicitud);
	    $procesosTable->getAdapter()->beginTransaction();
		try {
		    foreach ($procesos as $proc) {
                $procesosTable->find($proc["codproceso"])->current()->delete();
		    }
			$procesosTable->getAdapter()->commit();
		} catch(Exception $e) {
			$procesosTable->getAdapter()->rollBack();
			throw $e;
		}
	}
	
	/**
	 * Carga los datos de un proceso
	 * @param $codsolicitud Código del proceso
	 * @return Array con los datos del proceso
	 */
	public function cargarDatosProceso($codproceso){
	    $procesosTable = new Solicitudes_Model_DbTable_Procesos();
		return $procesosTable->find($codproceso)->current()->toArray();
	}
	
	/**
	 * Almacena los datos de evalución de la completitud del informe de autoevaluación
	 * @param array $datos Los datos que se registran
	 */
	public function guardarEvaluacionCompletitud(array $datos) {
		$procesosTable = new Solicitudes_Model_DbTable_Evaluarcompletitud();
		if(isset($datos["codevaluacion"]) && !empty($datos["codevaluacion"])) {
            $procesosTable->getAdapter()->update("evaluacioncompletitud_cna", "actual='N'", "codproceso={$datos["codproceso"]}");
		    $procesosTable->find($datos["codevaluacion"])->current()->setFromArray($datos)->save();
		} else {
		    unset($datos["codevaluacion"]);
			return $procesosTable->createRow($datos)->save();
		}
	}
	
	/**
	 * Busca las evaluaciones de completitud de un proceso
	 * @param $codproceso Código del proceso
	 * @return Array con los datos de la evalucion del proceso
	 */
	public function getEvaluacionProceso($codproceso,$actual=""){
	    $procesosTable = new Solicitudes_Model_DbTable_Evaluarcompletitud();
		return $procesosTable->getEvaluacionProceso($codproceso,$actual);
	}
	
	/**
	 * Consulta la tabla estados
	 * @return Array con los datos de los estados
	 */
	public function getEstados(){
        $procesosTable = new Solicitudes_Model_DbTable_Procesos();
	    return $procesosTable->getAdapter()-> fetchAll("SELECT codestado,nombre FROM estadosprocesos ORDER BY orden");
	}

	
	
	
}//fin de la clase